/**
 * ZHU framework. Copyright 2012-, all rights reserved.
 *
 * $Id: WebMessage.java 12 2012-07-27 08:48:07Z zhuxiaopeng $
 * $Revision: 12 $
 * $Date: 2012-07-27 16:48:07 +0800 (五, 2012-07-27) $
 * $Author: zhuxiaopeng $
 */
package zhu.framework.web;

import java.io.*;
import java.util.*;

import javax.faces.application.*;

import zhu.framework.service.*;
import zhu.framework.util.*;

/**
 * <p>
 * </p>
 * 
 * @author $Author: zhuxiaopeng $
 * @version $Revision: 12 $ - $Date: 2012-07-27 16:48:07 +0800 (五, 2012-07-27) $
 */
public final class WebMessage implements Serializable, Comparable<WebMessage> {

	private static final long serialVersionUID = 1L;

	/**
	 * <p>
	 * 指定された<code>{@link BusinessServiceMessage}</code>の内容に基づきこのオブジェクトを初期化する。
	 * 初期化されたオブジェクトは、指定されたBusiness層メッセージと同じ重要度と内容を持つ。
	 * </p>
	 * 
	 * @param src
	 *            メッセージの提供元
	 * @throws NullPointerException
	 *             <code>src==null</code>の場合
	 */
	WebMessage(final BusinessServiceMessage src) {
		this(WebSeverity.valueOf(src.getSeverity()), src.getSummary(), src.getDetail());
	}

	/**
	 * <p>
	 * 指定された内容に基づきこのclassのインスタンスを初期化する。 {@link #getSeverity() 深刻度}には
	 * <code>{@link WebSeverity#ERROR}</code>が、{@link #getDetail() 詳細メッセージ}には
	 * <code>null</code>が指定される。
	 * </p>
	 * <p>
	 * この呼び出しは
	 * <code>{@link #WebMessage(WebSeverity.framework.service.WebMessage.Severity, String, String) WebMessage(ERROR, summary, null)}</code>
	 * と等価である。
	 * </p>
	 * 
	 * @param summary
	 */
	public WebMessage(final String summary) {
		this(WebSeverity.ERROR, summary, null);
	}

	/**
	 * <p>
	 * 指定された内容に基づきこのclassのインスタンスを初期化する。 {@link #getDetail() 詳細メッセージ}は
	 * <code>null</code>が指定される。
	 * </p>
	 * <p>
	 * この呼び出しは
	 * <code>{@link #WebMessage(WebSeverity.framework.service.WebMessage.Severity, String, String) WebMessage(severity, summary, null)}</code>
	 * と等価である。
	 * </p>
	 * 
	 * @param sevirity
	 * @param summary
	 */
	public WebMessage(final WebSeverity sevirity, final String summary) {
		this(sevirity, summary, null);
	}

	/**
	 * <p>
	 * 指定された内容に基づきこのclassのインスタンスを初期化する。
	 * </p>
	 * 
	 * @param sevirity
	 * @param summary
	 * @param detail
	 */
	public WebMessage(final WebSeverity sevirity, final String summary, final String detail) {
		MyUtility.checkMethodParameterNotNull("severity", sevirity);
		MyUtility.checkMethodParameterNotNull("summary", summary);
		//
		this.severity = sevirity;
		this.summary = summary;
		this.detail = detail;
	}

	/**
	 * <p>
	 * メッセージの要旨を取得する。
	 * </p>
	 * 
	 * @return メッセージの要旨
	 */
	public String getSummary() {
		return summary;
	}

	/**
	 * <p>
	 * メッセージの深刻度を取得する。
	 * </p>
	 * 
	 * @return メッセージの深刻度
	 */
	public WebSeverity getSeverity() {
		return severity;
	}

	/**
	 * <p>
	 * メッセージの詳細記述を取得する。 このプロパティは<code>null</code>であり得る。
	 * </p>
	 * 
	 * @return メッセージの詳細記述、または<code>null</code>
	 */
	public String getDetail() {
		return detail;
	}

	/**
	 * <p>
	 * オブジェクトを{@link WebSeverity 深刻度}の順にソートするための順序づけを提供する。 この日各演算の結果は
	 * <code>{@link #equals(Object)}</code>及び<code>{@link #hashCode()}</code>
	 * による比較と互換性がない。
	 * </p>
	 */
	@Override
	public int compareTo(final WebMessage o) {
		return this.getSeverity().compareTo(o.getSeverity());
	}

	/**
	 * <p>
	 * このメッセージの内容を表現する<code>FacesMessage</code>を取得する。
	 * </p>
	 * 
	 * @return このメッセージの内容を表現する<code>FacesMessage</code>
	 */
	public FacesMessage toFacesMessage() {
		final FacesMessage value = new FacesMessage(this.getSeverity().toFacesSeverity(), getSummary(), getDetail());
		return value;
	}

	@Override
	public String toString() {
		final ToStringBuilder builder = new ToStringBuilder(this.getClass());
		builder.append("severity", getSeverity());
		builder.append("summary", getSummary());
		builder.append("detail", getDetail());
		//
		return builder.toString();
	}

	/**
	 * <p>
	 * Business層のメッセージをWEB層のメッセージに変換する。 変換後のメッセージは、元のメッセージと同じ受容度および内容を持つ。
	 * </p>
	 * 
	 * @param src
	 *            Business層のメッセージ
	 * @return WEB層のメッセージ
	 * @throws NullPointerException
	 *             <code>src==null</code>の場合
	 */
	static public WebMessage valueOf(final BusinessServiceMessage src) {
		MyUtility.checkMethodParameterNotNull("src", src);
		//
		return new WebMessage(src);
	}

	/**
	 * <p>
	 * Business層のメッセージのListをWEB層のメッセージのListに変換する。
	 * </p>
	 * 
	 * @param src
	 *            Business層のメッセージのList
	 * @return WEB層のメッセージのList
	 * @throws NullPointerException
	 *             <code>src==null</code>の場合
	 * @see #valueOf(BusinessServiceMessage)
	 */
	static public List<WebMessage> valueOf(final List<BusinessServiceMessage> src) {
		MyUtility.checkMethodParameterNotNull("src", src);
		//
		final List<WebMessage> value = new ArrayList<WebMessage>(src.size());
		for (final BusinessServiceMessage message : src) {
			value.add(WebMessage.valueOf(message));
		}
		return value;
	}

	private final WebSeverity severity;
	private final String summary;
	private final String detail;
}
